var chokidar = require('chokidar');
const livereload = require('livereload');
const fs = require('fs');
const nodemon = require('nodemon');
var { buildConfig } = require('./src/setting');
var { compilerStyle } = require('./src/style');
const path = require('path');
const { env } = require('process');
const localhostReload = livereload.createServer();

// 防抖函数
function debounce(func, wait) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
}

// 存储正在编译的模板，避免重复编译
const compilingTemplates = new Set();

//监听文件触发
function chokidarWatch() {
  const template = env.NODE_THEME;

  // 创建防抖函数，300ms 内重复触发只执行一次
  const debouncedStyleCompiler = debounce((template) => {
    if (compilingTemplates.has(template)) {
      console.log(`模板 ${template} 正在编译中，跳过重复编译`);
      return;
    }

    compilingTemplates.add(template);
    // 获取 style 目录下的所有 scss 文件
    const styleDir = `./src/theme/${template}/lib/style`;
    if (fs.existsSync(styleDir)) {
      const files = fs.readdirSync(styleDir);
      const scssFiles = files.filter((file) => path.extname(file) === '.scss');

      // 逐个编译 SCSS 文件
      let compileCount = 0;
      scssFiles.forEach((scssFile) => {
        const fromPath = path.join(styleDir, scssFile);
        const fileName = path.basename(scssFile, '.scss');

        // app.scss 使用特殊命名规则，其他文件使用原文件名
        const toPath =
          fileName === 'app'
            ? template === 'default'
              ? `./src/theme/${template}/assets/public.css`
              : `./src/theme/${template}/assets/${template}_theme.css`
            : `./src/theme/${template}/assets/${fileName}.css`;
        const purge = env.NODE_ENV === 'system' ? ['./src/theme/system/templates/ordersinglepage_index.liquid','./src/theme/system/templates/ordercodpage_index.liquid', './src/theme/system/snippets/cod_**.liquid', './src/theme/system/snippets/step_**.liquid'] : [`./src/theme/${template}/**/*.liquid`];
        compilerStyle(
          {
            purge,
            from: fromPath,
            to: toPath,
          },
          template,
          true,
          function () {
            compileCount++;
            console.log(`模板 ${template} 的 ${fileName}.scss 编译完成`);

            // 当所有文件编译完成时，从编译集合中移除
            if (compileCount === scssFiles.length) {
              compilingTemplates.delete(template);
              console.log(`模板 ${template} 所有 SCSS 文件编译完成`);
            }
          },
          // 当编译出现错误 回调错误函数 从编译集合中移除
          function () {
            compilingTemplates.delete(template);
          }
        );
      });

      // 如果没有 SCSS 文件，直接从编译集合中移除
      if (scssFiles.length === 0) {
        compilingTemplates.delete(template);
      }
    } else {
      compilingTemplates.delete(template);
    }
  }, 300); // 300ms 防抖延迟

  const debouncedConfigBuilder = debounce((template) => {
    if (compilingTemplates.has(template)) {
      console.log(`模板 ${template} 配置正在编译中，跳过重复编译`);
      return;
    }

    compilingTemplates.add(template);
    console.log('编译config');
    localhostReload.refresh('*');
    buildConfig(template);
    compilingTemplates.delete(template);
  }, 300); // 300ms 防抖延迟

  chokidar
    .watch([`./src/theme/${template}/lib/style/*.scss`, `./src/theme/${template}/lib/style/**/*.scss`, `./src/theme/${template}/**/*.liquid`], {
      ignoreInitial: true,
      awaitWriteFinish: {
        stabilityThreshold: 1000,
        pollInterval: 100,
      },
    })
    .on('change', () => {
      debouncedStyleCompiler(template);
    });
  if (env.NODE_ENV === 'dev') {
    chokidar
      .watch([`./src/theme/${template}/lib/config/*.json`, `./src/theme/${template}/sections/*.liquid`], {
        ignoreInitial: true,
        awaitWriteFinish: {
          stabilityThreshold: 1000,
          pollInterval: 100,
        },
      })
      .on('change', () => {
        debouncedConfigBuilder(template);
      });
  }
}
nodemon({
  script: 'app/app.js',
  ignore: ['node_modules/', 'oemsaas/', 'src/', 'config/', '.git/', 'admin/'],
}).on('start', function () {
  chokidarWatch();
});
